package modele.Batiment;

import java.util.ArrayList;

import controleur.Controleur;

import modele.Joueur;
import modele.Position;
import modele.Unite.UniteAttaquante;

public class CampMilitaire extends BatimentMilitaire {
	private static final long serialVersionUID = 7236427584655730219L;
	private int capaciteHebergementUniteAttaquante;
	private ArrayList<UniteAttaquante> listeUniteAttaquante;
	
	static protected final int capaciteHebergementUniteAttaquanteInitiale = 30;
	static public final int pointsDeVieInitiaux = 200;//utilisée par le reste du modèle
	static protected final int coutConstructionOrInitial = 100;
	static protected final int coutConstructionElixirInitial = 100;
	static protected final int tempsConstruction = 5;//en secondes
	static protected final int longueurCote = 1;
	public CampMilitaire(Position position) {
		super("campMilitaire", pointsDeVieInitiaux, 1, CampMilitaire.coutConstructionOrInitial, CampMilitaire.coutConstructionElixirInitial, CampMilitaire.tempsConstruction, CampMilitaire.longueurCote, position, null);
		capaciteHebergementUniteAttaquante = capaciteHebergementUniteAttaquanteInitiale;
		this.listeUniteAttaquante = new ArrayList<UniteAttaquante>();
		
	}
	
	public ArrayList<UniteAttaquante> getListeUniteAttaquante() {
		return listeUniteAttaquante;
	}

	public int getNbrUnitesHebergees()
	{
		return listeUniteAttaquante.size();
	}
	
	/**
	 * détermine si l'unité attaquante est créable ou non
	 * @param uniteAttaquante
	 * @param joueur joueur qui crée l'unité
	 * @return true si l'unité est créable, false sinon
	 */
	public boolean uniteAttaquanteCreable(UniteAttaquante uniteAttaquante)
	{
		int nbrUnites = getNbrUnitesHebergees();
		if(nbrUnites+1 <= capaciteHebergementUniteAttaquante)
		{
			if(uniteAttaquante.getCoutCreationOr() < joueur.getRessourceOr() && uniteAttaquante.getCoutCreationElixir() < joueur.getRessourceElixir())
				return true;
			else
				return false;
		}
		else
			return false;
	}
	
	/**
	 * ajoute l'unité au camp militaire ainsi qu'au joueur et provoque le paiement de cette unité
	 * @param joueur
	 * @param uniteAttaquante
	 */
	public void creerUniteAttaquante(Joueur joueur, UniteAttaquante uniteAttaquante) {
		if(uniteAttaquanteCreable(uniteAttaquante))
		{
			joueur.setRessourceOr(joueur.getRessourceOr() - uniteAttaquante.getCoutCreationOr());
			joueur.setRessourceElixir(joueur.getRessourceElixir() - uniteAttaquante.getCoutCreationElixir());
			listeUniteAttaquante.add(uniteAttaquante);
			joueur.ajouterUniteAttaquante(uniteAttaquante);
		}
	}
	

	public int getCapaciteHebergementUniteAttaquante() {
		return capaciteHebergementUniteAttaquante;
	}

	public void setCapaciteHebergementUniteAttaquante(
			int capaciteHebergementUniteAttaquante) {
		this.capaciteHebergementUniteAttaquante = capaciteHebergementUniteAttaquante;
	}
	
	/**
	 * augmente le nombre de places disponibles de 10
	 */
	@Override
	protected void augmenterNiveauSpecifique()
	{
		capaciteHebergementUniteAttaquante = capaciteHebergementUniteAttaquante + 10;
	}
	
	public void actionApresConstructionSpecifique(Controleur controleur){}
	
	
	public String resumerEtatSpecifique()
	{
		return new String(""+(capaciteHebergementUniteAttaquante-listeUniteAttaquante.size()));
	}
	
	protected int getPointsDeVieInitiaux()
	{
		return pointsDeVieInitiaux;
	}
}



